#include <iostream>
#include <unistd.h>
#include <signal.h>
void handler(int signo)
{
    std::cout << "获得一个信号" << std::endl;
    sigset_t pending;
    sigemptyset(&pending);
    sigpending(&pending);
    for (int i = 31; i > 0; i--)
    {
        if (sigismember(&pending, i))
        {
            std::cout << "1";
        }
        else
        {
            std::cout << "0";
        }
        std::cout << std::endl;
    }
    sleep(1);
}
int main()
{
    // 改变信号处理的另一种方式
    // int sigaction(int signum,const struct sigaction *_Nullable restrict act,struct sigaction *_Nullable restrict oldact);
    // struct sigaction 的结构如下
    //  struct sigaction {
    //             void     (*sa_handler)(int);
    //             void     (*sa_sigaction)(int, siginfo_t *, void *);
    //             sigset_t   sa_mask;
    //             int        sa_flags;
    //             void     (*sa_restorer)(void);
    //         };
    // 为什么要有sigaction sa_mask字段说明这些需要额外屏蔽的信号
    struct sigaction act, oact;//ocat是一个输出形参数
    act.sa_handler = handler;
    act.sa_flags = 0;
    sigemptyset(&(act.sa_mask));
    sigaddset(&(act.sa_mask),3);
    sigaddset(&(act.sa_mask),4);
    sigaddset(&(act.sa_mask),5);
    sigaddset(&(act.sa_mask),6);
    sigaction(2,&act,&oact);//设置到进程里面
    while (true)
    {
        std::cout << "我是一个进程: " << getpid() << std::endl;
        sleep(1);
    }
    //   |____信号未决_______________________________________|________信号传达(信号传达后pending对应的位置1->0)
    //收集信号                 阻塞/屏蔽信号              处理信号

    return 0;
}
//现象，程序运行起来第二个位置0  此时发送2号信号->2号位置为1 为什么我们没有主动屏蔽2号信号,此时2号信号为什么不被处理
//原因当某个信号的处理函数被调⽤时,内核⾃动将当前信号加⼊进程的信号屏蔽字,当信号处理函数返回时⾃动恢复原来的信号屏蔽字,这样就保证了在处理某个信号时,如果这种信号再次产⽣,那么 它会被阻塞到当前处理结束为⽌。


//我们发送3 4 5 6信号的时候为什么没有反应 因为我们利用了sigaction的sa_mark设置了屏蔽